Multiple & imbalanced classified

Multiple Classified
ROC 같은 이진 분류를 macro와 micro 평균 방식을 구현하여, OvA(One versus All) 방식을 사용하여, 다중 분류로 확장한다.
micro평균은 클래스별로 TP, TN, FP, FN을 계산하고 정밀도를 계산한다.
macro 평균은 클래스별 정밀도의 평균이다.
micro 평균은 각 샘플이나 예측에 동일한 가중치를 부여할 때, 사용한다.

macro 평균은 모든 클래스에 동일한 가중치를 부여하여 분류기의 전반적인 성능을 평가한다.
macro 방식은 가장 빈도 높은 클래스 레이블의 성능이 중요하다.
scikit-learn에서 이진 성능 지표로 다중 분류 모델을 평가하면, 정규화 또는 가중치가 적용된 macro 평균을 기본으로 이용한다.
가중치가 적용된 macro 평균은 평균을 계산할 때, 각 클래스 레이블의 샘플 개수를 가중하여 계산한다.
가중치가 적용된 macro 평균은 샘플 개수가 다른 불균현 클래스를 다룰 때, 유용하다.
sklearn.metrics 모듈 아래에 있는 측정 함수들은 average 매개변수로 평균 계산 방법 지정 가능
pre_scorer=make_scorer(score_func=precision_score, pos_label=1, greater_is_better=True, average='micro')
imbalanced classified
한개 또는 여러 개의 클래스 샘플이 데이터셋에 너무 많을 때이다.
스팸 필터링, 부정 감지, 질병 차단 등에 위와 같은 문제가 발생한다.
import numpy as np
X_imb=np.vstack((X[y==0], X[y==1][:40]))
y_imb=np.hstack((y[y==0], y[y==1][:40]))
vstack은 수직하게 결합-요소(열)의 개수가 일치 해야 한다.
hstack은 수평하게 결합
y_pred=np.zeros(y_imb.shape[0])
np.mean(y_pred==y_imb)*100

89.92443324937027

위와 같이 극단적인 데이터셋에서는 특정한 다수 클래스를 예측하면 높은 정확도를 보인다.
이와 같은 데이터셋에서는 정확도를 사용하는 것보다 다른 지표를 사용하는 것이 좋다.
-> 상황에 맞게 정밀도와 재현율 지표를 사용

악성 종양과 같이 대부분을 구별하는 것이 중요할 경우 재현율 지표를 사용
스팸 메일과 같은 경우 정확도를 사용
모델을 훈련하는 동안 불균형한 클래스를 다루는 방법은 소수 클래스에서 발생한 예측 오류에
큰 벌칙을 부여하는 것이다.

사이킷런 대부분의 분류기에 구현된 class_weight 매개변수를 class_weight=‘balance’로 설절해서 조정할 수 있다.

혹은 불균형한 클래스를 다루기 위해서 소수 클래스의 샘플을 늘리거나 다수 클래스의 샘플을 줄이거나 인공적으로 조정하는 것이다.

사이킷런 라이브러리는 데이터셋에서 중복을 허용한 샘플 추출 방식으로 소수 클래스의 샘플을 늘리는데 사용할 수 있는
resample 함수를 제공한다.
소수클래스(클래스1)를 선택하여 클래스 레이블 0인 샘플 개수와 동일 할 때까지 새로운 샘플을 반복적으로 추출
from sklearn.utils import resample
print(' 1 :', X_imb[y_imb==1].shape[0])
X_upsampled, y_upsampled=resample(X_imb[y_imb==1], y_imb[y_imb==1], replace=True, n_samples=X_imb[y_imb==0].shape[0], random_state=123)
print(' 1 :', X_upsampled.shape[0])

샘플링하기 전 클래스 1의 샘플 개수: 40

샘플링한 후 클래스 1의 샘플 개수: 357

X_bal=np.vstack((X[y==0], X_upsampled))
y_bal=np.hstack((y[y==0], y_upsampled))
y_pred=np.zeros(y_bal.shape[0])
np.mean(y_pred==y_bal)*100

50.0

다수 클래스 예측에서 50% 정확도를 달성한다.

이전의 resample 함수에서 클래스 레이블 1과 0을 서로 바꾸면 다운샘플링(downsampling) 할 수 있다.
새로운 인공적인 훈련 샘플을 생성하는 방법도 있다.
가장 널리 알려진 훈련 샘플 생성 알고리즘은 SMOTE(Synthetic Minority Over-sampling TEchnique)이다.